package com.flaginfo.mac;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.InetAddress;
import java.net.NetworkInterface;
import java.net.SocketException;
import java.net.UnknownHostException;
import java.util.LinkedList;
import java.util.Queue;

public class LocMac {
    	
	public static void queue(){
		Queue<String> queue = new LinkedList<String>();
		queue.offer("a");
		queue.offer("b");
		queue.offer("c");
		queue.offer("d");
		queue.offer("e");
		for (String item : queue) {
			System.out.println(item);
		}
		String str = queue.remove();
		System.out.println("被移除的是"+str+"还剩下："+queue.size()+"个");
		boolean flag = queue.remove("e");
		System.out.println("移除e,"+flag);
		String a = queue.poll();
		System.out.println("成功移除"+a);
	}
	
	
	public static void main(String[] args) {
		//java实现的队列
		queue();
		//1.获取当前操作系统的版本
		//System.out.println(getOSName());
		
		//2.获取windows7系统下的Mac地址
		//System.out.println(getWindow7MACAddress());
		
		//3.获取linux系统下Mac地址
		//System.out.println(getLinuxMACAddress());
		
		//4.获取Mac地址
		//System.out.println(getMacAddress());
		
		//5.获取系统路径
		//System.out.println(getSystemRoot());
		
		//6.获取硬盘序列号
		//System.out.println(getMotherboardSN());
		//String cpuId = getMotherboardSN();
		//java swing 弹出框显示硬盘序列号
		//javax.swing.JOptionPane.showConfirmDialog((java.awt.Component)null, cpuId, "Motherboard serial number",
				//javax.swing.JOptionPane.DEFAULT_OPTION);
	}
	
	
	
    /** 
    * @MethodName: getOSName  
    * @description : 获取当前操作系统名称. return 操作系统名称 例如:windows,Linux,Unix等 
    * @author：liming 
    * @date： 2013-5-5 下午04:43:36 
    * @return String 
    */  
    public static String getOSName() {  
        return System.getProperty("os.name").toLowerCase();  
    }  
      
    /** 
    * @MethodName: getWindowXPMACAddress  
    * @description : 获取widnowXp网卡的mac地址 
    * @author：liming 
    * @date： 2013-5-5 下午04:45:12 
    * @param execStr 
    * @return String 
    */  
    public static String getWindowXPMACAddress(String execStr) {  
        String mac = null;  
        BufferedReader bufferedReader = null;  
        Process process = null;  
        try {  
            // windows下的命令，显示信息中包含有mac地址信息  
            process = Runtime.getRuntime().exec(execStr);  
            bufferedReader = new BufferedReader(new InputStreamReader(process.getInputStream()));  
            String line = null;  
            int index = -1;  
            while ((line = bufferedReader.readLine()) != null) {  
                if(line.indexOf("本地连接") != -1)     //排除有虚拟网卡的情况  
                    continue;  
                  
                // 寻找标示字符串[physical address]  
                index = line.toLowerCase().indexOf("physical address");  
                if (index != -1) {  
                    index = line.indexOf(":");  
                    if (index != -1) {  
                        //取出mac地址并去除2边空格  
                        mac = line.substring(index + 1).trim();  
                    }  
                    break;  
                }     
            }  
        } catch (IOException e) {  
            e.printStackTrace();  
        } finally {  
            try {  
                if (bufferedReader != null) {  
                    bufferedReader.close();  
                }  
            } catch (IOException e1) {  
                e1.printStackTrace();  
            }  
            bufferedReader = null;  
            process = null;  
        }  
        return mac;  
    }  
      
    /** 
    * @MethodName: getWindow7MACAddress  
    * @description : 获取widnow7网卡的mac地址 
    * @author：liming 
    * @date： 2013-5-5 下午04:46:56 
    * @param execStr 
    * @return String 
    */  
    public static String getWindow7MACAddress() {  
        //获取本地IP对象  
        InetAddress ia = null;  
        try {  
            ia = InetAddress.getLocalHost();  
        } catch (UnknownHostException e) {  
            e.printStackTrace();  
        }  
        //获得网络接口对象（即网卡），并得到mac地址，mac地址存在于一个byte数组中。  
        byte[] mac = null;  
        try {  
            mac = NetworkInterface.getByInetAddress(ia).getHardwareAddress();  
        } catch (SocketException e) {  
            e.printStackTrace();  
        }  
        //下面代码是把mac地址拼装成String  
        StringBuffer sb = new StringBuffer();   
        for(int i=0;i<mac.length;i++){  
            if(i!=0){  
                sb.append("-");  
            }  
            //mac[i] & 0xFF 是为了把byte转化为正整数  
            String s = Integer.toHexString(mac[i] & 0xFF);  
            sb.append(s.length()==1?0+s:s);  
        }  
        //把字符串所有小写字母改为大写成为正规的mac地址并返回  
        return sb.toString().toUpperCase();  
    }  
      
    /** 
    * @MethodName: getLinuxMACAddress  
    * @description : 获取Linux网卡的mac地址 
    * @author：liming 
    * @date： 2013-5-5 下午04:49:13 
    * @return String 
    */  
    public static String getLinuxMACAddress() {  
        String mac = null;  
        BufferedReader bufferedReader = null;  
        Process process = null;  
        try {  
            // linux下的命令，一般取eth0作为本地主网卡 显示信息中包含有mac地址信息  
            process = Runtime.getRuntime().exec("ifconfig eth0");  
            bufferedReader = new BufferedReader(new InputStreamReader(process.getInputStream()));  
            String line = null;  
            int index = -1;  
            while ((line = bufferedReader.readLine()) != null) {  
                index = line.toLowerCase().indexOf("硬件地址");  
                if (index != -1) {  
                    // 取出mac地址并去除2边空格  
                    mac = line.substring(index + 4).trim();  
                    break;  
                }  
            }  
        } catch (IOException e) {  
            e.printStackTrace();  
        } finally {  
            try {  
                if (bufferedReader != null) {  
                    bufferedReader.close();  
                }  
            } catch (IOException e1) {  
                e1.printStackTrace();  
            }  
            bufferedReader = null;  
            process = null;  
        }  
        return mac;  
    }  
      
    /** 
    * @MethodName: getUnixMACAddress  
    * @description : 获取Unix网卡的mac地址 
    * @author：liming 
    * @date： 2013-5-5 下午04:49:59 
    * @return String 
    */  
    public static String getUnixMACAddress() {  
        String mac = null;  
        BufferedReader bufferedReader = null;  
        Process process = null;  
        try {  
            // Unix下的命令，一般取eth0作为本地主网卡 显示信息中包含有mac地址信息  
            process = Runtime.getRuntime().exec("ifconfig eth0");  
            bufferedReader = new BufferedReader(new InputStreamReader(process.getInputStream()));  
            String line = null;  
            int index = -1;  
            while ((line = bufferedReader.readLine()) != null) {  
                // 寻找标示字符串[hwaddr]  
                index = line.toLowerCase().indexOf("hwaddr");  
                if (index != -1) {  
                    // 取出mac地址并去除2边空格  
                    mac = line.substring(index + "hwaddr".length() + 1).trim();  
                    break;  
                }  
            }  
        } catch (IOException e) {  
            e.printStackTrace();  
        } finally {  
            try {  
                if (bufferedReader != null) {  
                    bufferedReader.close();  
                }  
            } catch (IOException e1) {  
                e1.printStackTrace();  
            }  
            bufferedReader = null;  
            process = null;  
        }  
  
        return mac;  
    }  
      
    /** 
    * @MethodName: getMacAddress  
    * @description :获取MAC地址 
    * @author：liming 
    * @date： 2013-5-5 下午04:53:25 
    * @return String 
    */  
    public static String getMacAddress(){  
        String os = getOSName();  
        String execStr = getSystemRoot()+"/system32/ipconfig /all";  
        String mac = null;  
        if(os.startsWith("windows")){  
            if(os.equals("windows xp")){//xp  
                mac = getWindowXPMACAddress(execStr);    
            }else if(os.equals("windows 2003")){//2003  
                mac = getWindowXPMACAddress(execStr);     
            }else{//win7  
                mac = getWindow7MACAddress();   
            }  
        }else if (os.startsWith("linux")) {  
            mac = getLinuxMACAddress();  
        }else{  
            mac = getUnixMACAddress();  
        }  
        return mac;  
    }  
      
    /** 
    * @MethodName: getSystemRoot  
    * @description :jdk1.4获取系统命令路径 ：SystemRoot=C:\WINDOWS 
    * @author：liming 
    * @date： 2013-5-5 下午04:56:27 
    * @return String 
    */  
    public static String getSystemRoot(){  
        String cmd = null;  
        String os = null;  
        String result = null;  
        String envName = "windir";  
        os = System.getProperty("os.name").toLowerCase();  
        if(os.startsWith("windows")) {  
            cmd = "cmd /c SET";  
        }else {  
            cmd = "env";  
        }  
        try {  
            Process p = Runtime.getRuntime().exec(cmd);  
            InputStreamReader isr = new InputStreamReader(p.getInputStream());  
            BufferedReader commandResult = new BufferedReader(isr);  
            String line = null;  
            while ((line = commandResult.readLine()) != null) {  
                line=line.toLowerCase();//重要(同一操作系统不同电脑有些返回的是小写,有些是大写.因此需要统一转换成小写)  
                if (line.indexOf(envName) > -1) {  
                    result =  line.substring(line.indexOf(envName)  
                            + envName.length() + 1);  
                    return result;  
                }  
            }  
        } catch (Exception e) {  
            System.out.println("获取系统命令路径 error: " + cmd + ":" + e);  
        }  
        return null;  
    }   
    
    public static String getMotherboardSN() {
    	  String result = "";
    	  try {
    	      File file = File.createTempFile("realhowto",".vbs");
    	      file.deleteOnExit();
    	      FileWriter fw = new java.io.FileWriter(file);

    	      String vbs =
    	         "Set objWMIService = GetObject(\"winmgmts:\\\\.\\root\\cimv2\")\n"
    	        + "Set colItems = objWMIService.ExecQuery _ \n"
    	        + "   (\"Select * from Win32_BaseBoard\") \n"
    	        + "For Each objItem in colItems \n"
    	        + "    Wscript.Echo objItem.SerialNumber \n"
    	        + "    exit for  ' do the first cpu only! \n"
    	        + "Next \n";
    	      fw.write(vbs);
    	      fw.close();
    	      Process p = Runtime.getRuntime().exec("cscript //NoLogo " + file.getPath());
    	      BufferedReader input = new BufferedReader(new InputStreamReader(p.getInputStream()));
    	      String line;
    	      while ((line = input.readLine()) != null) {
    	         result += line;
    	      }
    	      input.close();
    	    }
    	    catch(Exception e){
    	        e.printStackTrace();
    	    }
    	    return result.trim();
    	  }

}
